home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 2
/
United Public Domain Gold 2.iso
/
utilities
/
pu015.dms
/
pu015.adf
/
StarChart
/
Source
/
star1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-09-24
|
14KB
|
429 lines
/*=========================================================================
Star1.c -- This is the root module of the Star Chart program.
It opens up all windows and initializes all the required tables.
This module also includes the main IDCMP loop for the program. In
that loop other modules are called to do the actual processing for
searching and identifying stars and constellations.
Credits for Star Chart:
Robert L. Hill of the Orange County, CA. Amiga Friends User Group
wrote the original version of StarChart in AmigaBasic
The star data and many of the main functions of this
version are derived from that program.
Ray R. Larson wrote the c version 1.0 of StarChart, 'intuitionizing'
and enhancing the speed and functions of the original.
Version 1.2 (the present version) includes color
controls, requesters for parameter file loading
and saving, and use of the system clock in determining
the time of day and date during startup. 1.2 also uses
a sixteen color screen instead of the 8 colors used
in 1.0 and 1.1
Copyright (c) 1986 by Ray R. Larson
This program may be freely distributed and copied, but may not be sold
without the permission of the author. If you modify or enhance it,
please include the above credits (and please send me a copy!).
Ray R. Larson
6425 Central Ave. #304
El Cerrito, CA 94530
BitNet LARSON@UCBCMSA
=========================================================================*/
/*------------Header file for all of the standard stuff----*/
/*-------------plus definitions of global structures-------*/
#include "star.h"
/* macros for checking userport and timerport bits */
#define USERBIT 1L << w->UserPort->mp_SigBit
#define TIMERBIT 1L << timerport->mp_SigBit
/* macros for timer referencing */
#define SECONDS tr_time.tv_secs
#define MICROSECONDS tr_time.tv_micro
/*------------ External function declarations ------------*/
extern void *OpenLibrary();
extern struct Screen *OpenScreen();
extern struct Window *OpenWindow();
extern struct IntuiMessage *GetMsg();
extern struct MsgPort *CreatePort();
extern struct IORequest *CreateExtIO();
/*------------------ extern vars ------------------*/
extern struct star_rec StarTable[];
extern char *Greek[];
extern struct cons_rec Constel[];
extern struct Menu Titles[];
extern SHORT ErrorMessCount;
/*------------------- global variables -------------------*/
struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;
LONG IconBase;
LONG MathBase;
LONG MathTransBase;
struct RastPort *rp;
struct Gadget *SelectedGadget;
struct Window *w;
struct Screen *scr; /* pointer to the custom screen - RRL */
struct MsgPort *timerport; /* for timing signals */
struct timerequest timermsg;
UBYTE DefaultStartFile[140] = "DEFAULT.STAR";
long mask;
/*------------ Main Screen and Window Definitions ------------*/
/* The main screen */
struct NewScreen newscr =
{ 0, /* LeftEdge at zero */
0, /* TopEdge " */
640, /* Width - set later */
200, /* Height - non interlace */
4, /* depth - set later */
0, 1, /* DetailPen and BlockPen */
HIRES, /* special display mode */
CUSTOMSCREEN, /* The screen type */
NULL, /* use the default font */
(UBYTE *)"Star Chart: Version 1.2 ", /* Screen title */
NULL, /* No special gadgets */
NULL, /* Not a custom bitmap */
};
UBYTE WinTitle[] = "Star Chart : Version 1.2"; /* Window title */
/* new window structure */
struct NewWindow nw = {
0, 0, 640, 200, 0, 1,
/* IDCMP Flags */
MENUPICK
| MOUSEMOVE
| MOUSEBUTTONS
| CLOSEWINDOW
| GADGETDOWN
| GADGETUP,
/* Flags */
WINDOWCLOSE
| WINDOWDEPTH
| ACTIVATE
| REPORTMOUSE
| RMBTRAP,
NULL, /* First gadget */
NULL, /* Checkmark */
&WinTitle[0], /* Window title */
NULL, /* No custom streen */
NULL, /* Not a super bitmap window */
0, 0, 640, 200, /* Not used, but set up anyway */
CUSTOMSCREEN
};
/*------------------- color table definitions ------------------*/
UWORD defaultCT[32], CTable[32], *ctabptr;
struct ColorMap *cmap;
extern struct ViewPort *ViewPortAddress();
struct ViewPort *vport;
extern struct ColorMap *GetColorMap();
extern struct Preferences *GetPrefs();
extern struct WBStartup *WBenchMsg;
/*=========================================================================
Main routine of the StarChart program.
========================================================================*/
main(argc,argv)
int argc;
char **argv;
{
/*---------------- local vars ---------------*/
struct IntuiMessage *mes; /* Message pointer */
ULONG class; /* Message class */
USHORT code; /* Message code */
SHORT mx, my; /* Mouse X and Y */
APTR Iadr, adr; /* IAddress from Intuimessage */
ULONG flgs; /* temp IDCMP flags */
SHORT i;
char *clarg;
SHORT N_Bitplanes;
BOOL menus_on, timeout, othermsg, fromWB, UpDateTime();
struct FileLock *LastDir, *CurrentDir();
/*--------------- Check for WB or command line args -------------*/
fromWB = (argc == 0);
if (fromWB)
{ if(WBenchMsg->sm_NumArgs > 1)
strcpy(DefaultStartFile,WBenchMsg->sm_ArgList[1].wa_Name);
}
else /* started from CLI */
{ if (argc >= 2)
strcpy(DefaultStartFile, argv[1]);
}
/*----------- Open up graphics library and Intuition ------------*/
if ((GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library", NULL)) == NULL) {
printf("no graphics library on disk\n");
CloseThings();
exit(100);
}
mask |= GRAPHICS;
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", NULL)) == NULL) {
printf("No intuition library\n");
CloseThings();
exit(100);
}
mask |= INTUITION;
if ((IconBase = (LONG)OpenLibrary(ICONNAME,NULL))==NULL) {
printf("No Icon library!");
CloseThings();
exit(100);
}
mask |= ICONLIB;
if ((MathBase = (LONG)OpenLibrary("mathffp.library",NULL))==NULL) {
printf("No mathffp library!");
CloseThings();
exit(100);
}
mask |= MATHLIB;
if ((MathTransBase = (LONG)OpenLibrary("mathtrans.library",NULL))==NULL) {
printf("No mathtrans library!");
CloseThings();
exit(100);
}
mask |= MATHTRANS;
if ((timerport = CreatePort(0L,0L)) == NULL) {
printf("Can't create the timer port\n");
CloseThings();
exit(200);
}
mask |= TIMEPORT;
/* open up the custom screen */
if((scr = (struct Screen *)OpenScreen(&newscr)) == NULL)
{ printf("Can't open the custom screen!!\n");
CloseThings();
exit (3);
}
mask |= SCREEN;
/* Set window pointer to the custom screen */
nw.Screen = scr ;
/*----------- open window ----------*/
if ((w = OpenWindow(&nw)) == NULL) {
printf("Cannot open window\n");
CloseThings();
}
mask |= WINDOW;
/* ------------- Initialize some Globals, Menus, etc. -------------*/
/* set the raster port */
rp = w->RPort;
/* set the viewport address */
vport = ViewPortAddress(w);
/* copy the default colortable */
cmap = vport->ColorMap;
ctabptr = (UWORD *) cmap->ColorTable;
for (i=0; i < 32; i++)
defaultCT[i] = CTable[i] = ctabptr[i];
CTable[0] = 0x05A; /* register 0 is dark blue */
CTable[1] = 0xFFF; /* register 1 is white */
CTable[2] = 0x002; /* register 2 is Black (almost) */
CTable[3] = 0xFFF; /* register 4 is white */
CTable[4] = 0xEEE; /* register 5 is darker */
CTable[5] = 0xDDD; /* register 6 is darker */
CTable[6] = 0xCCC; /* register 7 is darrker */
CTable[7] = 0xBBB; /* register 8 is darker */
CTable[8] = 0xAAA; /* register 9 is darker */
CTable[9] = 0x999; /* register 10 is darker */
CTable[10] = 0x888; /* register 11 is medium gray */
CTable[11] = 0xF11; /* reqister 3 is bright red - */
CTable[12] = 0x00B; /* register 12 is dark blue */
CTable[13] = 0xF0F; /* register 13 is magenta */
CTable[14] = 0xFFF; /* register 14 is also white */
CTable[15] = 0xF80; /* register 15 is Orange */
/* change the registers to the new colors */
LoadRGB4(vport,&CTable,32L);
mask |= COLORMAP;
SetMenuStrip(w,Titles); /* Init the Menus */
mask |= MENU;
menus_on = FALSE; /* flag for interpreting mousemoves */
/* initialize the timer port */
init_timer();
/* set up some other globals(in starglb.c) and display the default stars */
initialize();
/* build the constellations menu */
InitConMenu();
/* change to the star pointer sprite */
do_StarSprite(w);
/* set the timer to go off in 1 second */
set_timer(&timermsg,1L,0L);
timeout = FALSE;
/* --------------- main loop -----------------*/
for (;;)
{
othermsg = FALSE;
if (timeout == TRUE)
{
timeout = FALSE;
/* increment the date/time display */
/* and redisplay stars each 'hour' */
if(UpdateTime()) DisplayStars();
set_timer(&timermsg,1L,0L);
if (ErrorMessCount > 0) /* time the error message */
{ ErrorMessCount--;
if (ErrorMessCount == 0)
SetWindowTitles(w,WinTitle,(UBYTE *)-1);
}
}
if ((mes = GetMsg(w->UserPort)) == NULL)
{
Wait((USERBIT) | (TIMERBIT));
if (GetMsg(timerport)) timeout = TRUE;
continue;
}
if (mes == NULL) continue;
class = mes->Class;
code = mes->Code;
mx = mes->MouseX;
my = mes->MouseY;
Iadr = mes->IAddress;
ReplyMsg(mes);
switch (class) {
case CLOSEWINDOW: CloseThings(); exit(NULL); break;
case GADGETUP: /* do nothing for now - except note that*/
/* the gadget was selected. */
SelectedGadget = (struct Gadget *)Iadr;
break;
case MENUPICK: /* Do menu processing (in star2.c) */
if (code != MENUNULL)
Do_menu((LONG)MENUNUM(code),
(LONG)ITEMNUM(code),
(LONG)SUBNUM(code));
break;
case GADGETDOWN: /* do nothing for now - except note that*/
/* the gadget was selected. */
SelectedGadget = (struct Gadget *)Iadr;
break;
case MOUSEBUTTONS: /* Handle mouse clicks, i.e. identify star or */
/* constellations based on the position of the*/
/* mouse pointer. (In Star5.c) */
Do_buttons(code,mx,my);
break;
case MOUSEMOVE: /* Handle mouse moves to see if the pointer is */
/* in the menu area - if so, permit selection */
if (my < 10)
{ if (menus_on == FALSE)
{menus_on = TRUE;
Forbid();
w->Flags &= ~RMBTRAP;
Permit();
ClearPointer(w);
}
}
else
if (menus_on)
{ menus_on = FALSE;
Forbid();
w->Flags |= RMBTRAP;
Permit();
do_StarSprite(w);
}
break;
} /* end of class switch */
} /* end of for(ever) loop */
}/* end of main */
/*========================================================================
init_timer - opens up the timer device for use.
========================================================================*/
init_timer()
{ return(OpenDevice(TIMERNAME,UNIT_VBLANK,&timermsg,0L));
}
/*========================================================================
set_timer - Sets the timer device to respond in the given number of
seconds and/or microseconds.
========================================================================*/
set_timer(tm,sec,micro)
struct timerequest *tm;
ULONG sec,micro;
{
tm->tr_node.io_Command = TR_ADDREQUEST;
tm->SECONDS = sec;
tm->MICROSECONDS = micro;
tm->tr_node.io_Flags = 0;
tm->tr_node.io_Error = 0;
tm->tr_node.io_Message.mn_ReplyPort = timerport;
SendIO(tm);
return (0);
}
/*========================================================================
CloseThings - Function that closes everything properly if any failures
occur before main loop entry,
======================================================================*/
CloseThings()
{
/* change the color registers back to default colors */
if (mask & COLORMAP) LoadRGB4(vport,&defaultCT,32L);
if (mask & MENU) ClearMenuStrip(w);
if (mask & WINDOW) CloseWindow(w);
if (mask & SCREEN) CloseScreen(scr);
if (mask & ICONLIB) CloseLibrary(IconBase);
if (mask & MATHLIB) CloseLibrary(MathBase);
if (mask & MATHTRANS) CloseLibrary(MathTransBase);
if (mask & TIMEPORT) DeletePort(timerport);
if (mask & INTUITION) CloseLibrary(IntuitionBase);
if (mask & GRAPHICS) CloseLibrary(GfxBase);
}